/*
C:85case
Date:20210414 20:25pm
key:1.经典动态规划，跳格子问题。对于第i个位置，考虑i到i+A[i]这个区间中哪个元素能跳的最远，最远的设置为新的i。
2.注意i-A[i]到i为什么不用考虑，因为如果前面的能跳得超过i(从左往i已经考虑了每一个点)，那当前的点就不可能是i，这是个悖论。因此从左往右时不用考虑i-A[i]到i。
3.一开始用一个最远距离数组存每个点能到的最远点，类似:B[i]=i+A[i]
*/
#include<iostream>
#include<vector>
#include<stack>
#include<queue>
using namespace std;
void jump(int* A, int* B,int &i, int& n)
{
	//遍历i及的右边A[i]个
	int new_i=i;
	int j;
	int max_len = 0;
	for (j = i; j <= i + A[i]; j++)
	{
		//cout << j << " ";
		if (B[j] >= max_len)
		{
			new_i = j;
			max_len = B[j];
			//if (j + A[j]+1 >= n)
			//{
			//	i = n;
			//	return;
			//}
		}
	}
	i = new_i;
}
int main()
{
	/*4
2 3 1 1*/
	//相当于在第i个格子，要检查[i-A[i],i+A[i]]里最大的。
	//这是在比较往右的最远距离,假设j在i-A[i]->i+A[i].
	//j<i时，最远距离为i-j+A[j].j>i时，最远距离为j-i+A[j].
	//先假设j<i不存在试试
	int i, j, n;
	cin >> n;
	if (n == 0) { cout << 0; return 0; }
	int* A = new int[n];
	for (i = 0; i < n; i++)
	{
		cin >> A[i];
	}
	//每个点能到的最远
	int* B = new int[n];
	for (i = 0; i < n; i++)
	{
		B[i] = i + A[i];
	}
	i = 0;
	int count = 0;
	while (1)
	{
		//每次把下标起点放入
		jump(A,B, i,n);
		//cout << i << " ";
		count++;
		//因为i是下标所以要+1
		if (i+1 >= n)
		{
			break;
		}
		
	}
	cout << count;
}